﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace FAS.Objetos
{
    public class Objetivo: IFas
    {
        #region Atributos
        public string IdObjetivo { get; set; }
        public int IdMateria { get; set; }
        public string Nombre { get; set; }
        public IList<Problema> Problemas { get; set; }
        private ConexionMySQL conexion = new ConexionMySQL();
        #endregion

        #region Constructor
        public Objetivo() { }
        public Objetivo(string nombre, IList<Problema> problemas, int IdMateria,string IdObjetivo)
        {
            this.IdMateria = IdMateria;
            this.Nombre = nombre;
            this.Problemas = problemas;
            this.IdObjetivo = IdObjetivo;
        }
        #endregion

        #region Metodos
        public static Objetivo GetObjetivo(string id_Objetivo, int IdMateria)
        {
            try
            {
                DataSet data = new ConexionMySQL().GetQuery("SELECT * FROM `Objetivo` where IdMateria = '"+IdMateria+"' AND IdObjetivo = '" + id_Objetivo + "'");
                Objetivo objetivo = new Objetivo();
                objetivo.IdObjetivo = id_Objetivo;
                objetivo.Nombre = data.Tables[0].Rows[0]["Nombre"].ToString();
                objetivo.IdMateria = int.Parse(data.Tables[0].Rows[0]["IdMateria"].ToString());
                objetivo.Problemas = getProblemas(id_Objetivo,objetivo.IdMateria);
                return objetivo;
            }
            catch { return null; }
            
        }

        public static IList<Problema> getProblemas(string idObjetivo, int IdMateria)
        {
            List<Problema> problemas = new List<Problema>();
            DataSet data = new ConexionMySQL().GetQuery("SELECT * FROM `Problema` where IdMateria = '" + IdMateria + "' AND  IdObjetivo = '" + idObjetivo + "'");
            foreach (DataRow r in data.Tables[0].Rows)
            {
                Problema p = new Problema();
                problemas.Add(Problema.GetProblema(int.Parse(r["IdProblema"].ToString())));
            }
            return problemas;
        }

        public static List<Objetivo> getAll(int materia)
        {
            DataSet data = new ConexionMySQL().GetQuery("SELECT * FROM `Objetivo` where IdMateria = '"+materia+"'");
            List<Objetivo> objetivos = new List<Objetivo>();
            foreach (DataRow row in data.Tables[0].Rows)
                objetivos.Add(GetObjetivo(row["IdObjetivo"].ToString(), materia));
            return objetivos;
        }

        public IList<Problema> GetProblemasRandom(int cantidad)
        {
            Random random = new Random();
            IList<Problema> problemas=new List<Problema>();
            ConexionMySQL conexion = new ConexionMySQL();
            DataTable data = conexion.GetQuery("SELECT IdProblema FROM Problema where IdObjetivo = '"+this.IdObjetivo+"' AND IdMateria = '"+this.IdMateria+"'").Tables[0];
            List<int> ids = new List<int>();
            for (int i = 0; i < cantidad;i++ )
            {
                int ra = random.Next(0,data.Rows.Count);
                while(ids.Contains(ra))
                    ra = random.Next(0, data.Rows.Count);
                ids.Add(ra);
                problemas.Add(Problema.GetProblema(int.Parse(data.Rows[ra][0].ToString())));
            }
            return problemas;
        }

        public Dictionary<string, object> getAtributos()
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("IdObjetivoP", IdObjetivo);
            diccionario.Add("IdMateriaP", IdMateria);
            diccionario.Add("NombreP", Nombre);
            return diccionario;
        }

        public Dictionary<string, object> getAtributosInsertar()
        {
            Dictionary<string, object> diccionario = new Dictionary<string, object>();
            diccionario.Add("NombreP", Nombre);
            diccionario.Add("IdMateriaP", IdMateria);
            return diccionario;
        }

        public bool update()
        {

            return conexion.AccionesDB(getAtributos(), "Updateobjetivo");
        }

        public bool delete()
        {
            return conexion.AccionesDB(getAtributos(), "DeleteObjetivo");
        }

        public int insertar()
        {
            conexion.insertar(getAtributos(), "Insertarobjetivo");
            return 1;
        }
        #endregion


       
    }
}
